/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include <UI/UI.h>
#include "框架/屏幕.h"

#include "框架/工作区/节点视口/ui节点面板.h"
#include "../播放条.h"

typedef struct {
	uint32 组;
	uint32 通道;
	uint32 点ID;
	uint32 GPU偏移;
	uint32 控制点;
}S_曲线扩展点拾取ID;

typedef struct {
	vec2 p1;
	vec2 p2;
	vec2 p3;
}控制点坐标;



class C_曲线编辑视口状态条 : public C_状态条 {

public:
	C_曲线编辑视口状态条(S_UI渲染环境& ctx);

	S_Props	m_过滤类型;

	S_Props	m_播放按钮;
	S_Props	m_当前帧;
	S_Props	m_帧区间;

	void f_重构();
};



class C_曲线编辑视口 : public C_Widget {

public:
	C_曲线编辑视口(S_UI渲染环境& ctx);
	~C_曲线编辑视口();

	//ui_绘制模板_预设图形	m_背景绘制;
	//ui_绘制模板_预设图形	m_选框线绘制;
	//ui_绘制模板_预设图形	m_旋转缩放线绘制;
	//ui_绘制模板_行文本绘制	m_标签绘制;
	//ui_绘制模板_刻度线		m_刻度线绘制;
	//ui_绘制模板_曲线		m_曲线绘制;
	//ui_绘制模板_预设图形	m_时间线绘制;


	bool		m_是否开启视线旋转物体;
	float32		m_旋转度;
	bool		m_是否未绘制;
	suvec2		m_GPU内存分配维度大小 = {};

	std::vector<S_曲线通道*>        m_动画曲线;
	std::vector<S_曲线扩展点拾取ID> m_拾取索引;
	std::vector<控制点坐标>         m_暂存位置;
	std::vector<vec2>               m_先对偏移;

	S_时间轴帧绘制信息 帧绘制信息;

	static C_曲线编辑视口* g当前操作曲线视口;
	static std::set<C_曲线编辑视口*> g_曲线视口页面;
	//int32	m_当前帧;
	//void	f_刷新时间帧绘制();


	C_曲线编辑视口状态条* mui_状态条;

	void	f_旋转辅助线绘制(vec2 中心坐标, float32 角度弧度, float32 长度);
	void	f_缩放辅助线绘制(vec2 中心坐标, float32 角度弧度, float32 长度);

	void	f_重建曲线绘制();
};




C_曲线编辑视口*	f_工作区页面_创建曲线视口(S_UI渲染环境& ctx);

void f_曲线视口_重构状态条(C_状态条* 状态条, C_Widget* 曲线视口);


bool	f_曲线编辑视口_刷新绘制();



E_事件是否传递 f_曲线页面工作区_拖拽时间帧(C_Widget* self, E_键位执行状态 状态);
//E_事件是否传递 f_曲线页面工作区_点击设置时间帧(C_Widget* self, uint8 状态);

E_事件是否传递 f_工作区_准备框选控制点(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_拖拽曲线视口选框(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_框选控制点(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_点选控制点(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_开启移动控制点(C_Widget* self, E_键位执行状态 状态);
//E_事件是否传递 f_工作区_移动控制点(C_Widget* self, uint8 状态);
E_事件是否传递 f_工作区_完成移动控制点(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_取消移动控制点(C_Widget* self, E_键位执行状态 状态);

E_事件是否传递 on_工作区_删除控制点(C_Widget* self, E_键位执行状态 状态);



void f_工作区_切换控制点类型(uint8 类型);















